package com.hdl.api;

import org.apache.zookeeper.*;

import java.io.IOException;
import java.util.concurrent.CountDownLatch;

/**
 * 类名 CreateSession
 * 描述 创建节点
 *
 * @author hedonglin
 * @version 1.0
 * @date 2020/6/14 12:27
 */
public class CreateNode implements Watcher {

    private static CountDownLatch countDownLatch = new CountDownLatch(1);
    private static ZooKeeper zooKeeper;

    /**
     * 建立会话并创建节点
     *
     * @param args
     */
    public static void main(String[] args) throws Exception {
        /**
         * 客户端可以通过创建一个zk实例来连接zk服务器
         * new Zookeeper(connectString, sessionTimeOut, Watcher)
         * connectString连接地址， IP：端口
         * sessionTimeOut： 会话超时时间，单位毫秒
         * Watcher：监听器（当特定事件触发监听时，zk会通过watcher通知客户端）
         */
        zooKeeper = new ZooKeeper("192.168.227.131:2181", 3000, new CreateNode());
        System.out.println(zooKeeper.getState());

        // 技术工具类：CountDownLatch: 不让Main方法结束，让线程处于等待阻塞
//        countDownLatch.await();
//        System.out.println("客户端与服务端会话真正建立了，当前状态为：" + zooKeeper.getState());

        Thread.sleep(Integer.MAX_VALUE);

        // 创建节点
//        createNodeSync();
    }


    /**
     * path ：节点创建的路径
     * data[] ：节点创建要保存的数据，是个byte类型的
     * acl ：节点创建的权限信息(4种类型)
     * ANYONE_ID_UNSAFE : 表示任何⼈
     * AUTH_IDS ：此ID仅可⽤于设置ACL。它将被客户机验证的ID替
     * 换。
     * OPEN_ACL_UNSAFE ：这是⼀个完全开放的ACL(常⽤)-->
     * world:anyone
     * CREATOR_ALL_ACL ：此ACL授予创建者身份验证ID的所有权限
     * createMode ：创建节点的类型(4种类型)
     * PERSISTENT：持久节点
     * PERSISTENT_SEQUENTIAL：持久顺序节点
     * EPHEMERAL：临时节点
     * EPHEMERAL_SEQUENTIAL：临时顺序节点
     * String node = zookeeper.create(path,data,acl,createMode);
     */
    private static void createNodeSync() throws KeeperException, InterruptedException {
        // 持久节点
        String nodePersistent = CreateNode.zooKeeper.create("/hdl-persistent", "持久节点内容".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
        // 临时节点
        String nodeEphemeral = CreateNode.zooKeeper.create("/hdl-ephemeral", "临时节点内容".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
        // 持久顺序节点
        String nodePersistentSequential = CreateNode.zooKeeper.create("/hdl-persistent-sequential", "持久顺序节点内容".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT_SEQUENTIAL);
        System.out.println("创建的持久节点：" + nodePersistent);
        System.out.println("创建的临时节点：" + nodeEphemeral);
        System.out.println("创建的持久顺序节点：" + nodePersistentSequential);
    }

    /**
     * 回调方法，处理来自服务器端的Watcher通知
     *
     * @param event
     */
    public void process(WatchedEvent event) {
        // SyncConnected
        if (event.getState() == Event.KeeperState.SyncConnected) {
            // 解除主程序在CountDownLatch上的等待阻塞
            System.out.println("process方法被执行了....");
//            countDownLatch.countDown();
            try {
                createNodeSync();
            } catch (KeeperException e) {
                e.printStackTrace();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

    }
}
